package com.igeek.service.impl;

import com.igeek.dao.AccountDao;
import com.igeek.service.AccountService;
import com.igeek.util.C3p0Util;
import org.apache.commons.dbutils.DbUtils;

import java.sql.Connection;

/**
 * 业务实现层：
 *      实现转账的逻辑
 */
public class AccountServiceImpl implements AccountService {


    private AccountDao accountDao = new AccountDao();

    /**
     * 转账业务：
     *      1.调用dao层，账户的转出和转入时，保证这两个操作是在同一个连接中进行的，这样才能够保证事务的一致性
     *      2.在事务当中，不可以使用 try-catch ，否则破坏了事务的一致性
     * @param from 转出的账户
     * @param to 转入的账户
     * @param money 转账金额
     * @return
     * @throws Exception
     */
    @Override
    public boolean transfer(String from, String to, double money) throws Exception {

        //1.先获取数据库连接
        Connection connection = C3p0Util.getConnection();

        //关闭自动提交
        connection.setAutoCommit(false);

        //2.调用dao中转账的业务
        //转出
        int row1 = accountDao.accountOut(connection,money,from);

        //转入
        int row2 = accountDao.accountInt(connection,money,to);

        //3.判断转账是否成功
        if(row1 > 0 && row2 > 0){
            //提交事务，并且关闭连接
            DbUtils.commitAndClose(connection);
            return true;
        } else{
            //回滚事务，并且关闭连接
            DbUtils.rollbackAndClose(connection);
            return false;
        }

    }
}
